home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / misc / xref_v1.1.lha / XRef / Tools / source / aguidexref.c next >
Encoding:
C/C++ Source or Header  |  1994-11-29  |  8.0 KB  |  280 lines

  1. /*
  2. ** $PROJECT: XRef-Tools
  3. **
  4. ** $VER: aguidexref.c 1.1 (07.08.94)
  5. **
  6. ** by
  7. **
  8. ** Stefan Ruppert , Windthorststraße 5 , 65439 Flörsheim , GERMANY
  9. **
  10. ** (C) Copyright 1994
  11. ** All Rights Reserved !
  12. **
  13. ** $HISTORY:
  14. **
  15. ** 07.08.94 : 001.001 :  initial
  16. */
  17.  
  18. /* ---------------------------- version string ---------------------------- */
  19.  
  20. /*FS*/ /*"Constants"*/
  21.  
  22. char *version = VERSTAG;
  23. char *xreftypes[] = {
  24.    "generic",
  25.    "function",
  26.    "command",
  27.    "include",
  28.    "macro",
  29.    "struct",
  30.    "field",
  31.    "typedef",
  32.    "define",
  33.    NULL};
  34.  
  35. /*FE*/
  36.  
  37. /* -------------------------- support functions --------------------------- */
  38.  
  39. /*FS*//*"STRPTR tmpname(struct GlobalData *gd)"*/
  40. STRPTR tmpname(struct GlobalData *gd)
  41. {
  42.    sprintf(gd->gd_FileBuffer,"T:ag_%lx%ld.guide",FindTask(NULL),++gd->gd_TempCount);
  43.    return(gd->gd_FileBuffer);
  44. }
  45. /*FE*/
  46. /*FS*/ /*"void getstdargs(struct GlobalData *gd,ULONG *para) "*/
  47. void getstdargs(struct GlobalData *gd,ULONG *para)
  48. {
  49.    UWORD linelength = 78;
  50.    UWORD columns    = 2;
  51.    ULONG limit      = ~0;
  52.  
  53.    /* try to get the defaults from the library */
  54.    GetXRefBaseAttrs(XREFBA_DefaultLimit,&limit,
  55.                     XREFBA_LineLength  ,&linelength,
  56.                     XREFBA_Columns     ,&columns,
  57.                     TAG_DONE);
  58.  
  59.    /* set given values */
  60.    gd->gd_Matching = XREFMATCH_PATTERN_CASE;
  61.  
  62.    if(para[ARG_NOPATTERN])
  63.       if(para[ARG_NOCASE])
  64.          gd->gd_Matching = XREFMATCH_COMPARE_NOCASE;
  65.       else
  66.          gd->gd_Matching = XREFMATCH_COMPARE_CASE;
  67.    else
  68.       if(para[ARG_NOCASE])
  69.          gd->gd_Matching = XREFMATCH_PATTERN_NOCASE;
  70.  
  71.    gd->gd_Num        = -1;
  72.    gd->gd_LineLength = (para[ARG_LINELENGTH]) ? (*((ULONG *) para[ARG_LINELENGTH])) : linelength;
  73.    gd->gd_Columns    = (para[ARG_COLUMNS]   ) ? (*((ULONG *) para[ARG_COLUMNS])   ) : columns;
  74.    gd->gd_Chars      = gd->gd_LineLength / gd->gd_Columns;
  75.  
  76.    gd->gd_LastEntry.e_Type = -1;
  77.  
  78.    gd->gd_Limit      = (para[ARG_LIMIT]) ? (*((LONG *) para[ARG_LIMIT])) : limit;
  79.    gd->gd_XRefFile   = (STRPTR) para[ARG_FILE];
  80.  
  81.    if(para[ARG_CATEGORY])
  82.       strcpy(gd->gd_Category,(STRPTR) para[ARG_CATEGORY]);
  83.  
  84.    if(para[ARG_STRING])
  85.       strcpy(gd->gd_String  ,(STRPTR) para[ARG_STRING]);
  86.    else
  87.       strcpy(gd->gd_String  ,"");
  88.  
  89.    gd->gd_Para     = para;
  90. }
  91. /*FE*/
  92.  
  93. /* --------------------------- parse hook entry --------------------------- */
  94.  
  95. /*FS*/ /*"RegCall GetA4 ULONG aguidehook(REGA0 struct Hook *hook,REGA2 struct XRefFileNode *xref,REGA1 struct xrmXRef *msg) "*/
  96. RegCall GetA4 ULONG aguidehook(REGA0 struct Hook *hook,REGA2 struct XRefFileNode *xref,REGA1 struct xrmXRef *msg)
  97. {
  98.    struct GlobalData *gd = (struct GlobalData *) hook->h_Data;
  99.  
  100.    if(msg->Msg == XRM_XREF)
  101.    {
  102.       struct TagItem *tstate = msg->xref_Attrs;
  103.       struct TagItem *tag;
  104.  
  105.       ULONG tidata;
  106.  
  107.       struct Entry *entry;
  108.  
  109.       if((entry = LibAllocPooled(gd->gd_Pool,sizeof(struct Entry))))
  110.       {
  111.          entry->e_Line = 0;
  112.  
  113.          while((tag = NextTagItem(&tstate)))
  114.          {
  115.             tidata = tag->ti_Data;
  116.          
  117.             switch(tag->ti_Tag)
  118.             {
  119.             case ENTRYA_Type:
  120.                entry->e_Type = tidata;
  121.                break;
  122.             case ENTRYA_File:
  123.                entry->e_File = (STRPTR) tidata;
  124.                entry->e_Node.ln_Name = (STRPTR) tidata;
  125.                break;
  126.             case ENTRYA_Name:
  127.                entry->e_Name = (STRPTR) tidata;
  128.                break;
  129.             case ENTRYA_Line:
  130.                entry->e_Line = tidata;
  131.                break;
  132.             case ENTRYA_NodeName:
  133.                entry->e_NodeName = (STRPTR) tidata;
  134.                break;
  135.             case XREFA_Path:
  136.                entry->e_Path = (STRPTR) tidata;
  137.                break;
  138.             }
  139.          }
  140.  
  141.          if(entry->e_Name && entry->e_File && entry->e_Type < XREFT_MAXTYPES)
  142.          {
  143.             gd->gd_Num++;
  144.             insertbyname(&gd->gd_EntryList,(struct Node *) entry);
  145.          } else
  146.             LibFreePooled(gd->gd_Pool,entry,sizeof(struct Entry));
  147.       }
  148.    } else
  149.       FPrintf (gd->gd_FileHandle,"Not supported hook message : %ld\n",msg->Msg);
  150.  
  151.    return(0);
  152. }
  153. /*FE*/
  154. /*FS*//*"BOOL parsexref(struct GlobalData *gd)"*/
  155. BOOL parsexref(struct GlobalData *gd)
  156. {
  157.    STRPTR file = NULL;
  158.  
  159.    gd->gd_Object = prgname;
  160.  
  161.    /* if a cachedirectory is given , build the full path */
  162.    if(gd->gd_Para[ARG_CACHEDIR])
  163.    {
  164.       /* check if there exists a file with contents of gd->gd_String */
  165.  
  166.       strcpy(gd->gd_FileBuffer,(STRPTR) gd->gd_Para[ARG_CACHEDIR]);
  167.       if(AddPart(gd->gd_FileBuffer,(STRPTR) gd->gd_String,PATH_LEN))
  168.       {
  169.          BPTR lock;
  170.  
  171.          if(!(lock = Lock(gd->gd_FileBuffer,SHARED_LOCK)))
  172.             file = gd->gd_FileBuffer;  /* set the filename to create the amigaguide */
  173.          else
  174.             UnLock(lock);
  175.       }
  176.    } else
  177.      file = tmpname(gd);
  178.  
  179.  
  180.    DB(("file : %s\n",file));
  181.    
  182.    if(file)
  183.    {
  184.       BPTR fh;
  185.  
  186.       if((fh = Open(file,MODE_NEWFILE)))
  187.       {
  188.          struct Hook hook = {NULL};
  189.          UWORD column   = gd->gd_Columns;
  190.  
  191.          gd->gd_FileHandle = fh;
  192.  
  193.          if(SysBase->lib_Version < 40)
  194.             column = 1;
  195.  
  196.          hook.h_Entry = (HOOKFUNC) aguidehook;
  197.          hook.h_Data  = gd;
  198.  
  199.          FPrintf(fh,"@database %s\n\n"
  200.                     "@node main \"%s\"\n"
  201.                     "@toc xref.library_xreffile@main\n"
  202.                     "@tab %ld\n",prgname,prgname,gd->gd_Chars);
  203.  
  204.          /* enable the xref.library dynamic node */
  205.          AddXRefDynamicNode();
  206.  
  207.          gd->gd_Num = 0;
  208.  
  209.          DB(("string : %s\n",gd->gd_String));
  210.  
  211.          if(strlen(gd->gd_String) > 0)
  212.             if((gd->gd_Pool = LibCreatePool(MEMF_CLEAR | MEMF_ANY,PUDDLE_SIZE,TRESH_SIZE)))
  213.             {
  214.                NewList(&gd->gd_EntryList);
  215.  
  216.                if(ParseXRefTags(gd->gd_String,
  217.                                 XREFA_Category  ,(gd->gd_Category[0]) ? gd->gd_Category : NULL,
  218.                                 XREFA_File      ,gd->gd_XRefFile,
  219.                                 XREFA_Matching  ,gd->gd_Matching,
  220.                                 XREFA_XRefHook  ,&hook,
  221.                                 XREFA_Limit     ,gd->gd_Limit,
  222.                                 TAG_DONE))
  223.                {
  224.                   struct Entry *entry;
  225.                   STRPTR lastfile = NULL;
  226.                   UWORD actcol = 0;
  227.  
  228.                   if(gd->gd_Num == 0)
  229.                      DisplayBeep(gd->gd_Screen);
  230.                   else if(gd->gd_Num == 1)
  231.                      gd->gd_LastEntry = *((struct Entry *) gd->gd_EntryList.lh_Head);
  232.                   else
  233.                      for(entry = (struct Entry *) gd->gd_EntryList.lh_Head ;
  234.                          entry->e_Node.ln_Succ ;
  235.                          entry = (struct Entry *) entry->e_Node.ln_Succ)
  236.                      {
  237.  
  238.                         /* write next file */
  239.                         if(lastfile != entry->e_File)
  240.                         {
  241.                            lastfile = entry->e_File;
  242.                            if(actcol)
  243.                               FPutC(fh,'\n');
  244.  
  245.                            FPrintf(fh,"\nFile : @{fg highlight}%s@{fg text}\n\n",(STRPTR) lastfile);
  246.                            actcol = 0;
  247.                         }
  248.  
  249.                         /* write the entry with the link to the documentation */
  250.                         FPrintf(fh,"@{\"%s\" link \"%s%s/%s\" %ld}\t",
  251.                                    entry->e_Name,
  252.                                    entry->e_Path,
  253.                                    entry->e_File,
  254.                                    entry->e_NodeName,
  255.                                    entry->e_Line);
  256.  
  257.                         if((++actcol == column) || !entry->e_Node.ln_Succ)
  258.                         {
  259.                            actcol = 0;
  260.                            FPutC(fh,'\n');
  261.                         }
  262.                      }
  263.  
  264.                   LibDeletePool(gd->gd_Pool);
  265.                }
  266.             }
  267.          FPrintf(fh,"\n@endnode\n");
  268.          Close(fh);
  269.  
  270.          /* delete cache file, if none or only one entry is found */
  271.          if(gd->gd_Para[ARG_CACHEDIR] && gd->gd_Num < 2)
  272.             DeleteFile(gd->gd_FileBuffer);
  273.       }
  274.    }
  275.  
  276.    return(TRUE);
  277. }
  278. /*FE*/
  279.  
  280.